//
//  criarViagemViewController.m
//  ViagemBem
//
//  Created by Wesley Thesolin de Faria on 29/10/13.
//  Copyright (c) 2013 Michel de Sousa Carvalho. All rights reserved.
//

#import "criarViagemViewController.h"
#import "AlertaViewController.h"
#import "TipoViagem.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
#import "GastosIniciaisViewController.h"

@interface criarViagemViewController ()
//@property (nonatomic) IBOutlet MKMapView *mapViagem;
@property (weak, nonatomic) IBOutlet UISegmentedControl *ctlTipoMapa;
@property (weak, nonatomic) IBOutlet UITextField *textOrigemCidade;
@property (weak, nonatomic) IBOutlet UIButton *btnMinhaLocalizacao;



@property (nonatomic) CLLocationManager *localizacaoUsuario;
@property (nonatomic) double latitudeUsuario;
@property (nonatomic) double longitudeUsuario;
@property (nonatomic, strong) NSString *cidadeOrigem;
@property (nonatomic, strong) NSString *cidadeDestino;
@property (nonatomic, strong) NSDictionary *dadosCidadeOrigem;
@property (nonatomic, strong) NSDictionary *dadosCidadeDestino;
@property (nonatomic, strong) NSDictionary *dadosViagem;
@property (nonatomic, strong) NSString *latitudeOrigem;
@property (nonatomic, strong) NSString *longitudeOrigem;

@property CLPlacemark *placemark;
@property CLPlacemark *placeMarkOrigem;
@property CLPlacemark *placeMarkDestino;

@end




@implementation criarViagemViewController

//Bloco de codigo responsavel por buscar a localizaco real do Usuario
#pragma mark CLLocationManagerDelegate
- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    CLLocationDegrees latitude = newLocation.coordinate.latitude;
    CLLocationDegrees longitude = newLocation.coordinate.longitude;
    self.latitudeUsuario = latitude;
    self.longitudeUsuario = longitude;

}
//Fim do bloco para localizaco do Usuario


//Esconde o teclado quando aperta Return
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}
//Fim do Esconder teclado


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

- (void)viewDidLoad
{
    
    
    [super viewDidLoad];
    _mapViagem.showsUserLocation = YES;
    MKUserLocation *userLocation = _mapViagem.userLocation;
    MKCoordinateRegion region =
    MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate,
                                       20000, 20000);
    [_mapViagem setRegion:region animated:NO];
    _mapViagem.delegate = self;
    [self getDirections];
    
    
    //Inicializacao do atributo localizacoUsuario
    self.localizacaoUsuario = [[CLLocationManager alloc] init];
    self.localizacaoUsuario.distanceFilter = 100.00;
    self.localizacaoUsuario.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    self.localizacaoUsuario.delegate = self;
    self.textDataFinal.delegate = self;
    self.textDataInicial.delegate = self;
    self.textDestino.delegate = self;
    self.textValorReservado.delegate = self;
    [self.localizacaoUsuario startUpdatingLocation];
    //Inicializa textOrigem
    self.textOrigemCidade.delegate = self;
    self.cidadeOrigem = [[NSString alloc]init];
    self.cidadeDestino = [[NSString alloc]init];
    
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    _mapViagem.centerCoordinate = userLocation.location.coordinate;

    [self reverseGeocode:userLocation.location];

    MKPointAnnotation *anotacaoPontoOrigem = [[MKPointAnnotation alloc] init];
    anotacaoPontoOrigem.coordinate = userLocation.location.coordinate;
    anotacaoPontoOrigem.title = @"Origem";
    [_mapViagem addAnnotation:anotacaoPontoOrigem];
    
    
}

- (void)getDirections
{
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    

    if (self.placeMarkOrigem != nil) {
        MKPlacemark *placeOrigem = [[MKPlacemark alloc]initWithPlacemark:self.placeMarkOrigem];

        MKMapItem *origemItem = [[MKMapItem alloc] initWithPlacemark:placeOrigem];
        request.source = origemItem;
    }else{
        request.source = [MKMapItem mapItemForCurrentLocation];
    }
//    NSLog(@"%@", )
    request.destination = _destination;
    request.requestsAlternateRoutes = NO;
    MKDirections *directions =[[MKDirections alloc] initWithRequest:request];
    NSLog(@"%@", request.destination);
    [directions calculateDirectionsWithCompletionHandler: ^(MKDirectionsResponse *response, NSError *error) {
//         if (error) {
//             // Handle error
//             NSLog(@"%@", error);
//         } else {
        
             [self showRoute:response];
//         }
     }];
}

-(void)showRoute:(MKDirectionsResponse *)response
{
    for (MKRoute *route in response.routes)
    {
        [_mapViagem addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
        
        for (MKRouteStep *step in route.steps)
        {
//            CLLocationAccuracy *te = kCLLocationAccuracyKilometer ;
//            kCLLocationAccuracyKilometer *t = kCLLocationAccuracyKilometer init
            
//            NSLog(@"%f", step.distance CL);
            NSLog(@"%@", step.instructions);
        }
    }
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id < MKOverlay >)overlay
{
    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
    renderer.strokeColor = [UIColor blueColor];
    renderer.lineWidth = 5.0;
    CLLocation *locA = [[CLLocation alloc] initWithLatitude:self.placeMarkOrigem.location.coordinate.latitude longitude:self.placeMarkOrigem.location.coordinate.longitude];
    
    CLLocation *locB = [[CLLocation alloc] initWithLatitude:self.placeMarkDestino.location.coordinate.latitude longitude:self.placeMarkDestino.location.coordinate.longitude];
    
    CLLocationDistance distance = [locA distanceFromLocation:locB];
//    distance = kCLLocationAccuracyKilometer;
    
    NSLog(@"%f", distance/1000);
//    renderer.observationInfo = (__bridge void *)([NSString stringWithFormat:@"%2.f", distance/1000 ]);
//    renderer.description = [NSString stringWithFormat:@"%2.f", distance/1000 ];
//    renderer.description =
    return renderer;
    
}



- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//Seta o tipo de mapa (Mapa, Satelite, Hibrido) atravel do controle de segmento
- (IBAction)setarTipoMapa:(id)sender {
    switch (((UISegmentedControl *)sender).selectedSegmentIndex) {
//            self.mapViagem = [[MKMapView alloc] init];
            
        case 0:
            self.mapViagem.mapType = MKMapTypeStandard;
            
            break;
            
        case 1:
            self.mapViagem.mapType = MKMapTypeSatellite;
            break;
            
        case 2:
            self.mapViagem.mapType = MKMapTypeHybrid;
            break;
    }
}
//Fim do botao setarMapa


//Funcao para mostrar no mapView
- (void) mostrarNoMapa: (double) latitudeDesejada com: (double) longitudeDesejada{
    
    //Responsavel por determinar o que Mapview mostrara
    MKCoordinateRegion regiaoMapa;
    //Responsavel pelo "aproximidade" do mapa
    MKCoordinateSpan spanAproximidade;
    //Responsavel pela localizacao (latitude, longitude)
    CLLocationCoordinate2D localizacao;
    //Responsavel pelo ponto no mapa
    MKPointAnnotation *anotacaoPonto = [[MKPointAnnotation alloc] init];
    
    //seta a aproximidade do mapa quanto mais proxima de 0 mais perto.
    spanAproximidade.latitudeDelta=1.0;
    spanAproximidade.longitudeDelta=1.0;
    
    localizacao.latitude = latitudeDesejada;
    localizacao.longitude = longitudeDesejada;
    
    //Centralizar o mapView na localicao e com a aproximidade certa
    regiaoMapa.span=spanAproximidade;
    regiaoMapa.center=localizacao;
    [self.mapViagem setRegion:regiaoMapa animated:TRUE];
    [self.mapViagem regionThatFits:regiaoMapa];
    [self.mapViagem setZoomEnabled: YES];
    
    //Coloca o ponto no mapView
    anotacaoPonto.coordinate = localizacao;
    anotacaoPonto.title = @"Local";
    [self.mapViagem addAnnotation:anotacaoPonto];

    
}


- (void) mostrarNoMapaOrigem: (double) latitude longitude: (double) longitude{
    

    MKCoordinateRegion regiaoMapa;
    MKCoordinateSpan spanAproximidade;
    CLLocationCoordinate2D localizacao;
    MKPointAnnotation *anotacaoPontoOrigem = [[MKPointAnnotation alloc] init];
    
    spanAproximidade.latitudeDelta=1.0;
    spanAproximidade.longitudeDelta=1.0;
    
    localizacao.latitude = latitude;
    localizacao.longitude = longitude;
    
    regiaoMapa.span=spanAproximidade;
    regiaoMapa.center=localizacao;
    [self.mapViagem setRegion:regiaoMapa animated:TRUE];
    [self.mapViagem regionThatFits:regiaoMapa];
    [self.mapViagem setZoomEnabled: YES];
    
    anotacaoPontoOrigem.coordinate = localizacao;
    anotacaoPontoOrigem.title = @"Origem";
    anotacaoPontoOrigem.subtitle = @"Ponto de saída da viagem";
    [self.mapViagem addAnnotation:anotacaoPontoOrigem];

}

- (void) mostrarNoMapaDestino: (double) latitude longitude: (double) longitude{
    
    
    MKCoordinateRegion regiaoMapa;
    MKCoordinateSpan spanAproximidade;
    CLLocationCoordinate2D localizacao;
    MKPointAnnotation *anotacaoPontoDestino = [[MKPointAnnotation alloc] init];
    
    spanAproximidade.latitudeDelta=1.0;
    spanAproximidade.longitudeDelta=1.0;
    
    localizacao.latitude = latitude;
    localizacao.longitude = longitude;
    
    regiaoMapa.span=spanAproximidade;
    regiaoMapa.center=localizacao;
    [self.mapViagem setRegion:regiaoMapa animated:YES];
    [self.mapViagem regionThatFits:regiaoMapa];
    [self.mapViagem setZoomEnabled: YES];
    
    anotacaoPontoDestino.coordinate = localizacao;
    anotacaoPontoDestino.title = @"Destino";
    anotacaoPontoDestino.subtitle = @"Ponto de chegada da viagem";
    //    anotacaoPontoOrigem.description = @"Origem da viagem";
    [self.mapViagem addAnnotation:anotacaoPontoDestino];
    
}



//Funcao depois que acaba de digitar a cidade origem
//Objetivo: Apos digitar a cidade mostrar no mapView a localizacao da mesma
- (IBAction)aposDigitarOrigem:(UITextField*)sender {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:sender.text completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error) {
            NSLog(@"%@", error);
            } else {
//                self.placemark = [placemarks lastObject];
//                [self mostrarNoMapa:self.placemark.location.coordinate.latitude com:self.placemark.location.coordinate.longitude];
//                self.cidadeOrigem = [self.placemark.addressDictionary objectForKey:@"FormattedAddressLines"][0];
                self.placeMarkOrigem =  [placemarks lastObject];
                [self mostrarNoMapaOrigem:self.placeMarkOrigem.location.coordinate.latitude longitude:self.placeMarkOrigem.location.coordinate.longitude];
                self.cidadeOrigem =  [self.placeMarkOrigem.addressDictionary objectForKey:@"FormattedAddressLines"][0];
                
            }
        }];
}
- (IBAction)aposDigitarDestino:(UITextField*)sender {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:sender.text completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error) {
            NSLog(@"%@", error);
        } else {
//            self.placemark = [placemarks lastObject];
//            [self mostrarNoMapa:self.placemark.location.coordinate.latitude com:self.placemark.location.coordinate.longitude];
//            self.cidadeDestino = [self.placemark.addressDictionary objectForKey:@"FormattedAddressLines"][0];
            self.placeMarkDestino = [placemarks lastObject];
            [self mostrarNoMapaDestino:self.placeMarkDestino.location.coordinate.latitude longitude:self.placeMarkDestino.location.coordinate.longitude];
            self.cidadeDestino =  [self.placeMarkDestino.addressDictionary objectForKey:@"FormattedAddressLines"][0];
//            if(self.placeMarkOrigem != nil)
//            self.placeMarkOrigem.location.coordinate;
//            }
            MKPlacemark *placeDestino = [[MKPlacemark alloc]initWithPlacemark:self.placeMarkDestino];
            NSLog(@"%@", placeDestino);
            MKMapItem *destinationItem = [[MKMapItem alloc] initWithPlacemark:placeDestino];
            self.destination = destinationItem;
//            [self.destination initWithPlacemark:placeDestino];
            
            [self getDirections];
        }
    }];
}


- (IBAction)getData:(id)sender {
    [self selecionarData:self.campoSelecionado];
}

- (IBAction)selecionarDataFinal:(UITextField*)sender {
    self.campoSelecionado = sender;
    [sender setInputView:self.datePickerData];
    [self exibeDatePicker];
    
}
- (IBAction)selecionarDataInicial:(UITextField*)sender {
    self.campoSelecionado = sender;
    [sender setInputView:self.datePickerData];
    [self exibeDatePicker];
}

//Funcao para colocar a localizacao do usuario na cidade de origem.
- (IBAction)addLocalizacaoUsuario:(id)sender {
    [self mostrarNoMapaOrigem:self.latitudeUsuario longitude:self.longitudeUsuario];
    [self reverseGeocode:self.localizacaoUsuario.location];
}

-(void) exibeDatePicker{
    self.datePickerData.hidden = NO;
    self.datePickerData.enabled = YES;
}

-(void) selecionarData:(UITextField*)textfield{
    NSDate * selected = [self.datePickerData date];
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy"];
    textfield.text = [dateFormatter stringFromDate:selected];
}
- (IBAction)apresentaCidadeOrigem:(UITextField*)sender {
    if([self.cidadeOrigem isEqualToString:@""]){
        [AlertaViewController showAlertUser:@"Cidade de origem inválida" header:@"Atenção"];
    }
    else{
        NSString *latitude = [NSString stringWithFormat:@"%f",self.placemark.location.coordinate.latitude];
        NSString *longitude = [NSString stringWithFormat:@"%f",self.placemark.location.coordinate.longitude];
        self.dadosCidadeOrigem = @{@"nome":self.cidadeOrigem, @"latitude": latitude, @"longitude": longitude};
        self.textOrigemCidade.text = self.cidadeOrigem;
    }
    
}
- (IBAction)apresentarCidadeDestino:(id)sender {
    if([self.cidadeDestino isEqualToString:@""]){
        [AlertaViewController showAlertUser:@"Cidade de origem inválida" header:@"Atenção"];
    }
    else{
        NSString *latitude = [NSString stringWithFormat:@"%f",self.placemark.location.coordinate.latitude];
        NSString *longitude = [NSString stringWithFormat:@"%f",self.placemark.location.coordinate.longitude];
        self.dadosCidadeDestino = @{@"nome":self.cidadeDestino, @"latitude": latitude, @"longitude": longitude};
        self.textDestino.text = self.cidadeDestino;
    }
}

- (IBAction)criarViagem:(id)sender {
    if([self validadosViagem]){
        Cidade *cidadeOrigem;
        Cidade *cidadeDestino;
        NSArray *verificaCidade = [CidadeDAO verificaCidade:self.cidadeOrigem];
        if(![verificaCidade count]>0){
            cidadeOrigem = [CidadeDAO inserirCidade:self.dadosCidadeOrigem];
        }else{
            cidadeOrigem = verificaCidade[0];
        }
        verificaCidade = [CidadeDAO verificaCidade:self.cidadeDestino];
        if(![verificaCidade count]>0){
            cidadeDestino = [CidadeDAO inserirCidade:self.dadosCidadeDestino];
        }else{
            cidadeDestino = verificaCidade[0];
        }
        NSArray *tpviagem = [TipoViagemDAO retornaTipoViagem:[self getTipoViagem:[self.selectTpViagem selectedSegmentIndex]]];
        TipoViagem *tipoviagem = tpviagem[0];
        NSDateFormatter *dateformater = [[NSDateFormatter alloc] init];
        [dateformater setDateFormat:@"ddMMyyyy"];
        NSNumber *valor = [NSNumber numberWithDouble:[self.textValorReservado.text doubleValue]];
        self.dadosViagem = @{@"cidadeOrigem":cidadeOrigem, @"cidadeDestino":cidadeDestino, @"dataInicial":[dateformater dateFromString:[self.textDataInicial.text stringByReplacingOccurrencesOfString:@"/" withString:@""]], @"dataFinal": [dateformater dateFromString:[self.textDataFinal.text stringByReplacingOccurrencesOfString:@"/" withString:@""]],
                             @"valorReservado":valor, @"tipoViagem":tipoviagem, @"usuario": self.usuario
                             };
        self.viagem = [ViagemDAO inserirViagem:self.dadosViagem];
        if(self.viagem!=nil){
            [AlertaViewController showAlertUser:@"Viagem inserida" header:@"Sucesso"];
            [self performSegueWithIdentifier:@"segueGastosIniciais" sender:self];
            //[self dismissViewControllerAnimated:YES completion:nil];
            
            
        }else{
            [AlertaViewController showAlertUser:@"Erro" header:@"Atenção"];
        }
        
    }else{
        [AlertaViewController showAlertUser:@"Verifique todos os dados" header:@"Atenção"];
    }
}

-(BOOL) validadosViagem{
    if(([self.cidadeDestino isEqualToString:@""])||([self.cidadeDestino isEqualToString:@""])){
        return NO;
    }else if(([self.textDataFinal.text isEqualToString:@""])||([self.textDataInicial.text isEqualToString:@""])||([self.textValorReservado.text isEqualToString:@""])){
        return NO;
    }
    else{
        return YES;
    }
}

-(NSString*) getTipoViagem:(int)indice{
    NSString *tipoviagem = [[NSString alloc] init];
    switch (indice) {
        case 0:
            tipoviagem = @"Passeio";
            break;
        case 1:
            tipoviagem = @"Negócio";
            break;
        default:
            break;
    }
    return tipoviagem;
}
- (void)reverseGeocode:(CLLocation *)location {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        NSLog(@"Finding address");
        if (error) {
            NSLog(@"Error %@", error.description);
        } else {
            self.placeMarkOrigem = [placemarks lastObject];
            self.cidadeOrigem = [self.placeMarkOrigem.addressDictionary objectForKey:@"FormattedAddressLines"][2];
            NSString *latitude = [NSString stringWithFormat:@"%f",self.placemark.location.coordinate.latitude];
            NSString *longitude = [NSString stringWithFormat:@"%f",self.placemark.location.coordinate.longitude];
            self.dadosCidadeOrigem = @{@"nome":self.cidadeOrigem, @"latitude": latitude, @"longitude": longitude};
            self.textOrigemCidade.text = self.cidadeOrigem;
        }
    }];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"segueGastosIniciais"]) {
        GastosIniciaisViewController *gastos = [segue destinationViewController];
        gastos.viagem = self.viagem; //Envia o objeto usuário para a próxima view
        gastos.usuario = self.usuario;
        
    }
}

@end
